package com.tao.content.MQConsumer;

import com.tao.content.domain.pojo.CoursePublish;
import com.tao.content.service.impl.CoursePublishServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * <p>
 * 监听课程发布队列
 * </p>
 *
 * @author taohongrun
 * @since 2024/11/18
 */
@RabbitListener(queues = "course_publish_queue")
@Slf4j
public class CoursePublishConsumer {
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    CoursePublishServiceImpl coursePublishService;
//    @Autowired
//    private RedisService redisService;
//    @Autowired
//    private EsService esService;

    @RabbitListener
    public void handleCoursePublish(CoursePublish coursePublish) {
        try {
            // TODO: 2024/11/18 redis缓存
//            // 1.Redis缓存
//            //保证幂等性
//            if (redisService.exists(course.getId())) {
//                return; // 已处理,直接返回
//            }
//            redisService.setCourse(course);

            // TODO: 2024/11/18 ES索引存储
//            // 2.ES索引
//            //保证幂等性
//            if (redisService.exists(course.getId())) {
//                return; // 已处理,直接返回
//            }
//            esService.indexCourse(course);

            // 3.MinIO存储
            //保证幂等性
            //已经在mediaService实现幂等性
            coursePublishService.generateAndUploadMinio(coursePublish.getId());

        } catch (Exception e) {
            // 记录失败日志,可以后续重试
            log.error("课程发布失败", e);

            // 可以考虑将失败消息发送到死信队列
            rabbitTemplate.convertAndSend("dead_letter_exchange", "course.fail", coursePublish);
        }
    }

    // 死信队列消费者
    @RabbitListener(queues = "course_publish_dead_letter_queue")
    public void handleFailedPublish(CoursePublish coursePublish) {
        // 1.记录失败详情
        // 2.可以设置最大重试次数
        // 3.人工介入处理
    }
}
